package demo1;

import java.util.Currency;

/**
 * @ClassDescription:
 * @JdkVersion: 1.8
 * @Author: 李白
 * @Created: 2024/4/12 22:01
 */


public class Test {
    public static void main3(String[] args) {
        Cycle a = new Cycle();
        Shape b = new Cycle();
        System.out.println(a.a);//因为a是Cycle类的，所以优先调用Cycle类的a,如果Cycle可以重新给a赋值，那么a的值就是最后定义的值
        /**
         * 父类无法继承子类的变量，用子类的创建方法无法改变父类的成员变量的值，当用父类的对象引用成员变量时
         */
        System.out.println(b.a);//b是Shape类的，b的a只能在Shape里找，没有就没有，无法继承子类的a
    }
    public static void drawMap(Shape shape){//静态方法
        shape.draw();
    }
    public static void main(String[] args) {
        /**
         * 和int[] a ={}一样，花括号内传的参数就是int型的，这里的传的就是Shape型的，只不过是子类，但子类也是继承父类的，所以也属于父类
         * 其中，new Cycle()表示的就是一个数据，只不过数据比较多，开辟了一篇空间，利用Cycle()构造方法进行赋值
         */

       /* Shape shape = new Cycle();
        Shape shape1 = new Rect();
        Shape shape2 = new Trangle();*/
        /**
         * 直接new + 构造方法也是可以，这相当于给一个地址指定的空间赋值了，只是还没有对象指向这个地址
         * 所以在数组里可以直接赋值，数组凭借下标，每一个元素对应一个空间
         */
        /**
         * 利用多态，完成子类多个方法的重写，从而更高级
         */
        //利用数组，完成父类创建对象，子类构造方法赋值的向上转型
        Shape[] shapes = {new Cycle(),new Rect(),new Cycle(),new Rect(),new Trangle(),new Flowers()};//Shape[]指的是Shape型的数组，每一个元素都是Shape型或者其子类
        /**
         * shapes数组里的元素是已经赋值过了的空间，所以用一个对象来指向这个空间，然后才能通过这个对象调用对象里的成员变量（属性）、方法
         */
        for (Shape shape : shapes) {//把数组shapes的第一个元素赋值给shape，然后执行foreach里的代码块，执行完之后，返回for循环；然后再执行，直到赋值完毕
            shape.draw();//首先要有重写的方法，然后父类的引用调用这个重写的方法
        }
    }
    public static void main1(String[] args) {
        Cycle cycle = new Cycle();//要调用方法只能通过对象来调用，所以要创建对象
        Trangle trangle = new Trangle();
        Rect rect = new Rect();
        String[] strings = {"cycle","rect","cycle","rect","trangle"};
        for (String x :strings) {
            if (x.equals("cycle")){
                cycle.draw();
            }else if (x.equals("rect")){
                rect.draw();
            }else if (x.equals("trangle")){
                trangle.draw();
            }
        }
    }
}

/**
 * 所有的类都默认有一个构造方法，用来开辟空间用，如果重载一个带参数的构造方法，就可以进行赋值
 */
class Shape{
    public int a = 10;
    /**
     * 构造方法：访问限定修饰符+类名+（）+{}
     */
    public Shape(){
    }
    public void draw(){
        System.out.println("xingzhuang");
    }

}
class Cycle extends Shape{
    public int a = 20;
    public Cycle(){
        a = 30;
    }
    /**
     * 方法的重写
     *返回类型相同，除非是父子类型
     * 方法名相同
     * 参数列表相同
     */
    public void draw(){//子类继承父类，方法的重写
        System.out.print("⭕");
    }
}

class Rect extends Shape{
    @Override
    public void draw() {
        System.out.print("矩形");
    }
}
class Flowers extends Shape{
    @Override
    public void draw() {
        System.out.print("❀");
    }
}

class Trangle extends Shape{
    @Override
    public void draw() {
        System.out.print("▲");
    }
}